package ejb.casacentral.service.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import comun.casacentral.proxy.ofiventa.remito.ItemsRemitoXML;
import comun.casacentral.proxy.ofiventa.remito.RemitoXML;
import comun.casacentral.proxy.ofiventa.remito.RodamientoRemitoXML;
import comun.casacentral.proxy.parceador.UtilsXML;

import ejb.casacentral.log.CasaLogger;
import ejb.casacentral.persistence.entity.GrupoIP;
import ejb.casacentral.persistence.entity.ItemRodamiento;
import ejb.casacentral.persistence.entity.Remito;
import ejb.casacentral.persistence.entity.SolicitudCompra;
import ejb.casacentral.service.jms.MensajeJMSSender;

@Stateless
public class RemitoControllerBean implements RemitoController {
	
	
	@PersistenceContext(unitName="casacentral")
	private EntityManager em;
	
	@EJB
	private GrupoIPController grupoIPController;
	
	@EJB
	private MensajeJMSSender jmsSender;
	
	@EJB
	private SolicitudController solicitudController;
	
	@Override
	public void generarRemitos(Set<String> codigosSolicitudes) {
		
		CasaLogger.log();
		

		List<SolicitudCompra> solicitudes = solicitudController.obtenerSolicitudesPorCodigos(codigosSolicitudes);
		
		HashMap<String, Remito> remitos = new HashMap<String, Remito>();

		CasaLogger.log(" Generando Remitos a partir de las Solicitudes Completadas.... ");
		
		for (SolicitudCompra solicitud : solicitudes) {

			List<ItemRodamiento> rodamientos = solicitud.getRodamientos();
			
			if (remitos.get(solicitud.getOficinaVenta().getSucursal()) != null ){
				
				Remito remito = remitos.get(solicitud.getOficinaVenta().getSucursal());
				remito.addRomdamietos(rodamientos);
				
			}else{
				Remito remito = new Remito();
				
				remito.setCodigo(Long.valueOf(0));
				remito.setFechaEmision(new Date());
				remito.setRodamientos(rodamientos);
				remito.addSolicitud(solicitud);
				remito.setOficinaVenta(solicitud.getOficinaVenta());
				
				remitos.put(remito.getOficinaVenta().getSucursal(), remito);
				
			}


		}
		
		CasaLogger.log(" Resistiendo Remitos generados.... ");
		
		for (Remito remito :remitos.values()){
			
			CasaLogger.log(" persistiendo entidad .... ");
			
			
			remito = em.merge(remito);
			em.flush();
			
			
			
			String remitoXml = parseoRemitoToXML(remito);
			
			CasaLogger.log (" oficina "+ remito.getOficinaVenta().getSucursal());
			
			GrupoIP grupo = grupoIPController.obtenerPorCodigo(remito.getOficinaVenta().getSucursal());
				
			jmsSender.sendMesaje(remitoXml, grupo.getIp(), "recibirRemitoQueue");
		}
		
		
		
	}
	
	private String parseoRemitoToXML(Remito remito){
		
		UtilsXML parser = new UtilsXML();
		
		RemitoXML remitoXML = new RemitoXML();
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
		
		remitoXML.setFecha(format.format(remito.getFechaEmision()));
		ItemsRemitoXML itemsXML = new ItemsRemitoXML();
		
		for(ItemRodamiento item: remito.getRodamientos()){
			RodamientoRemitoXML rodXML = new RodamientoRemitoXML();
			rodXML.setCodigoRodamiento(item.getRodamiento().getCodigo());
			rodXML.setCantidad(item.getCantidad());
			itemsXML.addRodamiento(rodXML);
		}
		
		remitoXML.setCasaCentral(1);
		remitoXML.setNroSCODV(Integer.valueOf(String.valueOf(remito.getSolicitudes().get(0).getCodigo())));
		remitoXML.setNumero(Integer.valueOf(String.valueOf(remito.getCodigo())));
		
		
		remitoXML.setItems(itemsXML);
		String xml =parser.toXML(remitoXML, RemitoXML.class);
		CasaLogger.log(xml);
		return parser.toXML(remitoXML, RemitoXML.class);
	}


	


}
